﻿/* Line操作相关的JS. add by terry */

// 设置曲线路径.   ano by terry
//              var arcPath=function(leftHand, d) {
//                  var start = leftHand ? d.source : d.target,
//                          end = leftHand ? d.target : d.source,
//                          dx = end.x - start.x,
//                          dy = end.y - start.y,
//                          dr = Math.sqrt(dx * dx + dy * dy),
//                          sweep = leftHand ? 0 : 1;
//                  return "M" + start.x + "," + start.y + "A" + dr + "," + dr +
//                          " 0 0," + sweep + " " + end.x + "," + end.y;
//              };



// 计算公式.
// https://www.cnblogs.com/worldFulcrum/p/5573927.html
//
// add by terry 设置线条样式.
// d 为线对象.
var arcPath=function(leftHand, d) {
    var start = leftHand ? d.source : d.target;
    var end = leftHand ? d.target : d.source;
    
    // 计算圆周率 ************ start
    // 半径为5像素*********************此半径可以随意设置，设置的越多，越粗，越少越细.
    var r = 5;
    // 将数据中的r取出.
    r = d.r;
    
    // 设置x，y中心坐标.
    var a = end.x;
    var b = end.y;
    // 一圈需要划分多少块.
    var du = 360 / 360;  
    // 获取夹角.
    var jj = getAngle(end.x,end.y,start.x,start.y)- 80;
    // 设置度数.
    var hudu = (2*Math.PI / 360) * du * jj;
    var newSX = a + Math.sin(hudu) * r;
    var newSY = b - Math.cos(hudu) * r  
    // 获取夹角.
    jj = getAngle(end.x,end.y,start.x,start.y) + 80;
    // 设置度数.
    hudu = (2*Math.PI / 360) * du * jj;
    var lx = a + Math.sin(hudu) * r;
    var ly = b - Math.cos(hudu) * r  
    // 计算圆周率 ************ end
    
    // 画封闭线.
    var res = "M" + start.x + "," + start.y + 
    		  " L" + newSX + "," + newSY +
    		  " L" + lx + "," + ly ;
    
    return res;
};

// 设置文本路径.
var arcTextPath=function(leftHand, d) {
    var start = leftHand ? d.source : d.target,
            end = leftHand ? d.target : d.source,
            dx = end.x - start.x,
            dy = end.y - start.y,
            dr = Math.sqrt(dx * dx + dy * dy),
            sweep = leftHand ? 0 : 1;
            
    return "M" + start.x + "," + start.y + "A" + dr + "," + dr +
            " 0 0," + sweep + " " + end.x + "," + end.y;
};

// add by terry 初始化线条.
var lineInit=function(vis) {
	return vis.selectAll("line.link")
                .data(defaultConfig.data.links)
                .enter().append("svg:path")
                .attr("class", "link")
                .attr('stroke-width',0)
                .attr('id', function (d) {
                	// 两个节点id为线条的id.
                    return d.source.id + '_' + d.target.id;
                })
                .attr('marker-end', function (d) {
                    if (d.source.id == d.target.id) {
                        return false; //不应该有指向自己的关系 异常处理
                    } else {
                        return "url(#arrow)"
                    }
                })
                .attr('stroke','#18a1cf')
                .attr('fill',function (d) {
                	// 设置颜色填充.
                	return d.lineColor;
                });
                
// 设置填充使用.
//              .attr('fill','url(#lineFill)');
};


// add by terry 设置曲线上的文字.
var lineTextInit=function(vis) {
	return vis.selectAll('.linetext')
            .data(defaultConfig.data.links)
            .enter()
            .append("text")
            .append('avg:textPath')
            .attr("class","linetext")
            .attr("startOffset", "50%")
            .attr("text-anchor", "middle")
            .attr('id', function (d) {
                return d.source.id + '_' + d.target.id + '_text';
            })
            .attr("xlink:href", function(d) {
                if (d.source.id == d.target.id) {
                    return false; //不应该有指向自己的关系 异常处理
                } else {
                    return "#" + d.source.id + "_" + d.target.id;
                }
            })
            .text(function(d){
            	// 如果label设置为不显示.
            	if(d.labelVisible == "0"){
            		return "";
            	}
                return d.relation + " " + (typeof(d.value)=='undefined'?"":d.value);  //关系文字
            })
            .attr('fill','#000000');
};


// ******************目前未开发对线条上标签的操作，等后续应用场景需要时，可以添加。
// 设置线条信息.
var setLine=function(id,tid,key,value) {
	// 线条id
	var lineId = id+"_"+tid;
	// 获取展示线条.
	var line = document.getElementById(lineId);
	var line2 = document.getElementById(tid+"_"+id);
	if(line2){
		line = line2;
		lineId = tid+"_"+id;
	}
	// 获取线条对应的文本.
	var lineText = document.getElementById(lineId+"_text");
	// 获取线条对象json中的部分 .
	var lineObj = getLineObj(id,tid);
	// 设置关联文字.
	if(key == "relation"){
		// 修改json对象.
		lineObj.relation = value;
		lineText.textContent = value;
		return;
	}
	// 设置label是否显示.
	if(key == "labelVisible"){
		// 修改json对象.
		lineObj.labelVisible = value;;
		if(lineObj.labelVisible == "0"){
			lineText.textContent = "";
		}else{
			lineText.textContent = lineObj.relation;
		}
		return;
	}
	
	// 设置线条颜色.
	if(key == "lineColor"){
		// 修改json对象.
		lineObj.lineColor = value;
		// 重置文本坐标.
		line.setAttribute("fill",value);
		return;
	}
	// 设置字体方向.
	if(key == "r"){
		// 修改json对象.
		lineObj.r = value;
		// 因为有tick所以不用进行任何操作，自己就会改变.
		window.tick();
		return;
	}
	
};